package com.djf.djfword.service;

import com.djf.djfword.entity.ContractData;
import org.springframework.stereotype.Service;

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;

/**
 * 合同数据服务类
 * 模拟后端数据处理，提供合同相关数据
 * 
 * @author djf
 */
@Service
public class ContractDataService {
    
    private final Random random = new Random();
    private final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy年MM月dd日");
    
    // 模拟员工姓名数据
    private final String[] names = {
        "张三", "李四", "王五", "赵六", "钱七", "孙八", "周九", "吴十",
        "陈明", "刘华", "杨丽", "黄强", "朱伟", "林静", "郭勇", "何敏"
    };
    
    // 模拟职位数据
    private final String[] positions = {
        "Java开发工程师", "前端开发工程师", "产品经理", "UI设计师", 
        "测试工程师", "运维工程师", "数据分析师", "项目经理",
        "架构师", "技术总监", "人事专员", "财务专员"
    };
    
    // 模拟薪资数据
    private final String[] salaries = {
        "8000元/月", "12000元/月", "15000元/月", "18000元/月", 
        "20000元/月", "25000元/月", "30000元/月", "35000元/月"
    };
    
    // 模拟地址数据
    private final String[] addresses = {
        "北京市朝阳区建国路88号", "上海市浦东新区陆家嘴金融中心", 
        "广州市天河区珠江新城", "深圳市南山区科技园",
        "杭州市西湖区文三路", "成都市高新区天府大道",
        "武汉市洪山区光谷大道", "南京市鼓楼区中山路"
    };
    
    // 模拟电话数据
    private final String[] phones = {
        "138****1234", "139****5678", "186****9012", "187****3456",
        "158****7890", "159****2345", "176****6789", "177****0123"
    };
    
    /**
     * 根据员工ID获取合同数据
     * 模拟从数据库或其他数据源获取员工信息
     * 
     * @param employeeId 员工ID
     * @return 合同数据
     */
    public ContractData getContractDataByEmployeeId(String employeeId) {
        // 模拟根据员工ID查询数据库
        ContractData contractData = new ContractData();
        
        // 使用员工ID作为随机种子，确保同一员工ID返回相同数据
        Random idRandom = new Random(employeeId.hashCode());
        
        contractData.setEmployeeName(names[idRandom.nextInt(names.length)]);
        contractData.setPosition(positions[idRandom.nextInt(positions.length)]);
        contractData.setSalary(salaries[idRandom.nextInt(salaries.length)]);
        contractData.setAddress(addresses[idRandom.nextInt(addresses.length)]);
        contractData.setPhone(phones[idRandom.nextInt(phones.length)]);
        
        // 生成身份证号（模拟）
        contractData.setIdCard(generateIdCard());
        
        // 设置日期
        LocalDate startDate = LocalDate.now().plusDays(idRandom.nextInt(30));
        contractData.setStartDate(startDate.format(formatter));
        
        LocalDate endDate = startDate.plusYears(3);
        contractData.setEndDate(endDate.format(formatter));
        
        contractData.setCurrentDate(LocalDate.now().format(formatter));
        
        // 生成合同编号
        contractData.setContractNo("HT" + LocalDate.now().getYear() + 
                                  String.format("%04d", idRandom.nextInt(9999)));
        
        // 设置公司信息
        contractData.setCompanyName("某某科技有限公司");
        contractData.setLegalRepresentative("张总");
        contractData.setCompanyAddress("北京市朝阳区科技园区123号");
        contractData.setWorkLocation("北京市朝阳区科技园区123号");
        
        // 设置合同条款
        contractData.setContractPeriod("3年");
        contractData.setProbationPeriod("3个月");
        contractData.setWorkingHours("每日8小时，每周40小时，双休");
        contractData.setBenefits("五险一金、年终奖、带薪年假、节日福利、培训机会");
        contractData.setOtherTerms("遵守公司规章制度，保守商业秘密，履行岗位职责");
        
        return contractData;
    }
    
    /**
     * 创建新员工合同数据
     * 
     * @param employeeName 员工姓名
     * @param position 职位
     * @param salary 薪资
     * @return 合同数据
     */
    public ContractData createNewContractData(String employeeName, String position, String salary) {
        ContractData contractData = new ContractData();
        
        contractData.setEmployeeName(employeeName);
        contractData.setPosition(position);
        contractData.setSalary(salary);
        
        // 随机分配其他信息
        contractData.setAddress(addresses[random.nextInt(addresses.length)]);
        contractData.setPhone(phones[random.nextInt(phones.length)]);
        contractData.setIdCard(generateIdCard());
        
        // 设置日期
        LocalDate startDate = LocalDate.now().plusDays(7); // 一周后入职
        contractData.setStartDate(startDate.format(formatter));
        
        LocalDate endDate = startDate.plusYears(3);
        contractData.setEndDate(endDate.format(formatter));
        
        contractData.setCurrentDate(LocalDate.now().format(formatter));
        
        // 生成合同编号
        contractData.setContractNo("HT" + LocalDate.now().getYear() + 
                                  String.format("%04d", random.nextInt(9999)));
        
        // 设置公司信息
        contractData.setCompanyName("某某科技有限公司");
        contractData.setLegalRepresentative("张总");
        contractData.setCompanyAddress("北京市朝阳区科技园区123号");
        contractData.setWorkLocation("北京市朝阳区科技园区123号");
        
        // 设置合同条款
        contractData.setContractPeriod("3年");
        contractData.setProbationPeriod("3个月");
        contractData.setWorkingHours("每日8小时，每周40小时，双休");
        contractData.setBenefits("五险一金、年终奖、带薪年假、节日福利、培训机会");
        contractData.setOtherTerms("遵守公司规章制度，保守商业秘密，履行岗位职责");
        
        return contractData;
    }
    
    /**
     * 批量获取合同数据
     * 
     * @param count 数量
     * @return 合同数据列表
     */
    public List<ContractData> getBatchContractData(int count) {
        List<ContractData> contractList = new ArrayList<>();
        
        for (int i = 0; i < count; i++) {
            String employeeId = "EMP" + String.format("%03d", i + 1);
            ContractData contractData = getContractDataByEmployeeId(employeeId);
            contractList.add(contractData);
        }
        
        return contractList;
    }
    
    /**
     * 获取示例合同数据
     * 用于演示
     * 
     * @return 示例合同数据
     */
    public ContractData getSampleContractData() {
        ContractData contractData = new ContractData();
        
        contractData.setEmployeeName("张三");
        contractData.setPosition("Java开发工程师");
        contractData.setSalary("15000元/月");
        contractData.setAddress("北京市朝阳区建国路88号");
        contractData.setPhone("138****1234");
        contractData.setIdCard("110101199001011234");
        
        LocalDate startDate = LocalDate.now().plusDays(7);
        contractData.setStartDate(startDate.format(formatter));
        
        LocalDate endDate = startDate.plusYears(3);
        contractData.setEndDate(endDate.format(formatter));
        
        contractData.setCurrentDate(LocalDate.now().format(formatter));
        contractData.setContractNo("HT2024001");
        
        contractData.setCompanyName("某某科技有限公司");
        contractData.setLegalRepresentative("张总");
        contractData.setCompanyAddress("北京市朝阳区科技园区123号");
        contractData.setWorkLocation("北京市朝阳区科技园区123号");
        
        contractData.setContractPeriod("3年");
        contractData.setProbationPeriod("3个月");
        contractData.setWorkingHours("每日8小时，每周40小时，双休");
        contractData.setBenefits("五险一金、年终奖、带薪年假、节日福利、培训机会");
        contractData.setOtherTerms("遵守公司规章制度，保守商业秘密，履行岗位职责");
        
        return contractData;
    }
    
    /**
     * 生成模拟身份证号
     * 
     * @return 身份证号
     */
    private String generateIdCard() {
        StringBuilder idCard = new StringBuilder();
        
        // 地区码（前6位）
        idCard.append("110101");
        
        // 出生日期（8位）
        int year = 1980 + random.nextInt(25); // 1980-2004年
        int month = 1 + random.nextInt(12);
        int day = 1 + random.nextInt(28);
        idCard.append(String.format("%04d%02d%02d", year, month, day));
        
        // 顺序码（3位）
        idCard.append(String.format("%03d", random.nextInt(999)));
        
        // 校验码（1位，这里简化为随机数字）
        idCard.append(random.nextInt(10));
        
        return idCard.toString();
    }
    
    /**
     * 验证员工ID是否存在
     * 
     * @param employeeId 员工ID
     * @return 是否存在
     */
    public boolean isEmployeeExists(String employeeId) {
        // 模拟验证逻辑，这里简单判断ID格式
        return employeeId != null && employeeId.matches("EMP\\d{3}");
    }
}